package cn.wolfocde.wolf2w.service.impl;

import cn.wolfocde.wolf2w.domain.Destination;
import cn.wolfocde.wolf2w.domain.Region;
import cn.wolfocde.wolf2w.query.QueryObject;
import cn.wolfocde.wolf2w.repository.DestinationRepository;
import cn.wolfocde.wolf2w.repository.RegionRepository;
import cn.wolfocde.wolf2w.service.IRegionService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.*;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

@Service
public class IRegionServiceImpl implements IRegionService {
    @Autowired
    private DestinationRepository destinationRepository;
    @Autowired
    private RegionRepository regionRepository;
    @Autowired
    private MongoTemplate mongoTemplate;

    /**
     * 查询结果集合分页排序
     * @return qo
     */
    @Override
    public Page<Region> query(QueryObject qo) {
        Query query = new Query();

        long rows = mongoTemplate.count(query, Region.class);
        //分页对象  当前页 从第0页算起,每页10个数据   就是分成第几页的数据,每页数据多条数据,
        // 你传来当前页多少,就给你看当前页的数据
        Pageable pageable= PageRequest.of(qo.getCurrentPage()-1,10, Sort.Direction.ASC,"sequence");//按id排序
        query.with(pageable);
        //select * from xx  where xx =id oder by xx limit(xx ,xx)
        //
        List<Region> list = mongoTemplate.find(query, Region.class);
        //集合 分页排序对象,数据条数
        return new PageImpl<Region>(list,pageable,rows);//等于pageResult对象
    }

    //获取区域下所有目的地
    // 根据某个区域id获取对应的目的地对象集合
    @Override
    public List<Destination> getDestByRegionId(String rid) {
        Optional<Region> byId = regionRepository.findById(rid);
        Region region = byId.orElse(null);
        List<String> refIds = region.getRefIds();

        //new 一个list集合,添加每个目的地对象,再设置到list集合返回

        List<Destination> destinations = new ArrayList<>();
        for (String id:refIds) {
            Optional<Destination> byId1 = destinationRepository.findById(id);
            Destination destination = byId1.orElse(null);
            destinations.add(destination);
        }

        return destinations;
    }
//    /** 查询编辑/添加页面关联下拉框的所有目的地集合
//     * @return 所有目的地集合
//     *  @param deep
//     */
    @Override
    public List<Destination> getDestByDeep() {
        return  destinationRepository.findAll();
    }


    @Override
    public void save(Region region) {
        //目的是mongoDb主键才自增
        region.setId(null);
        regionRepository.save(region);
    }

    @Override
    public void update(Region region) {
        //mongoDbd的修改方法是全量更新:就是所有的参数一起修改掉,所以要保证前端传来的数据和数据库的数据一样.
        // 不然会造成表的字段丢失.(不一样就先查询出来,然后替换后设置)
        //这里的是一样的,所以可以不查询出来
        regionRepository.save(region);
    }

    @Override
    public void delete(String id) {
        regionRepository.deleteById(id);
    }

    @Override
    public List<Region> list() {
        return regionRepository.findAll();
    }


    @Override
    public Region get(String id) {
        return regionRepository.findById(id).orElse(null);
    }
}
